package net.xo68.destiny.core.timingwheel;

import net.xo68.destiny.core.timingwheel.handle.TimeoutEventHandler;

import java.io.Serializable;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 时光轮调度
 * @author wuxie
 * @version 2020-10-16
 */
public interface TimingWheel<T> {



    /**
     * 将触发参数转换为超时项推入时光轮缓存队列
     * @param triggerParameter
     * @param delay
     * @param unit
     * @return
     */
    Timeout<T> newTimeout(T triggerParameter, long delay, TimeUnit unit);

    /**
     * 取消息超时项
     * @param taskSequence
     * @return
     */
    boolean cancelTimeout(String taskSequence);

    /**
     * 时光轮工作状态
     * @return
     */
    int getWorkerState();

    /**
     * 时光轮启动时间,单位：毫秒数
     * @return
     */
    long getStartTime();

    /**
     * 轮子的格子数量
     * @return
     */
    long getTicksPerWheel();

    TimingWheelTaskSequencer<T> getSequencer();

    /**
     * 轮子每个格了的间隔时间，单位毫秒
     * @return
     */
    long getTickDuration();

    /**
     * 时光轮最大下标
     * @return
     */
    long getMask();

    /**
     * 时光轮走过的格子总数
     * @return
     */
    AtomicLong getTick();

    /**
     * 跳到下一格子(刻度)
     * @return
     */
    long nextTick();

    /**
     * 时光轮容器
     * @return
     */
    ConcurrentHashMap<Long, TimingWheelBucket<T>> getWheel();

    /**
     * 任务缓冲
     * @return
     */
    HashedTimeoutBuffer<T> getHashedBuffer();

    /**
     * 多线程任务执行器
     * @return
     */
    TimingWheelTaskExecutor getTaskExecutor();

    /**
     * 是否运行中
     * @return
     */
    boolean isRunning();

    /**
     * 超时项队列,新任务先进行此队列
     * @return
     */
    Queue<Timeout<T>> getTimeouts();

    /**
     * 准备取消的超时项队列
     * @return
     */
    Queue<Timeout<T>> getCancelledTimeouts();

    /**
     * 即将超时项数量
     * @return
     */
    AtomicLong getPendingTimeouts();

    TimeoutEventHandler<T> getEventHandler();

    /**
     * 启动
     */
    void start();

    /**
     * 关闭
     */
    Set<Timeout<T>> shutdown();
}
